<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <BODY>       
        <?php
// exemple 2 de $p objets parmi $n objets référencés par des carctères
        $Tab = array();
        $compteur = 0;
        $p = 5;
        $collection = 'ABCDEFGHIJ';
        $n = strlen($collection);
        $pairVoulu = 3;
        $impairVoulu = 2;
        echo("p= $p, $n objets référencés par les caractères de la chaine $collection<br/>\n");
        if ($Tab = Cpn2($p, $collection)) {
            $d = count($Tab);
            echo("nombre de combinaisons: $d<br/>\n");
            for ($i = 0; $i < $d; $i++) {               
                if (substr_count($Tab[$i], 'GH')<1) {
                    $pair = $impair = 0;
                    $seek = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I','J');
                    $replace = array('5 ', '10 ', '16 ', '18 ', '20 ','24 ', '32 ', '33 ', '38 ', '46 ');
                    $resultat = trim(str_replace($seek, $replace, $Tab[$i]));
                    $num = explode(' ', $resultat);
                    foreach ($num as $key => $value) {
                        if ($value % 2)
                            $impair ++;
                        else
                            $pair ++;
                    }

                    if (($pairVoulu == $pair) && ($impairVoulu == $impair)) {
                        echo str_replace(' ', '-', $resultat) . ' (' . $pair . 'p/' . $impair . 'i)<br/>';
                        $compteur ++;
                    }
                }
            }
        } else {
            echo("erreur<br>");
        }
        echo 'Nombre de possibilités : ' . $compteur . ' soit ' . round($compteur * 100 / $d, 2) . '%';
        ?>
        <hr/>

    </BODY>
</HTML>

<?php

//--------------------
//--- fonction: liste les combinaisons de $p pris dans une collection de $n 
//    objets référencés par les caractères d'une chaine $collection
function Cpn2($p, $collection) {
    $n = strlen($collection);
    $Liste = array("");
    $Combi = array("");
    $ncombi = 0;
    $np1mp = $n + 1 - $p;
    $rang = 0;
    do {
        ($rang <= 0) ? $decal = 0 : $decal = strpos($collection, substr($Liste[$rang - 1], -1)) + 1;
        $souscollection = substr($collection, $decal, $np1mp);
        $liste = $Liste[$rang];
        $choix = substr($souscollection, strspn($souscollection, $Liste[$rang]), 1);
        $Liste[$rang].= $choix;
        $liste = $Liste[$rang];
        if ($choix != "") {
            $rang++;
            $Liste[$rang] = "";
        } else {
            $rang--;
        }
        if ($rang >= $p) {
            $Combi[$ncombi] = "";
            for ($j = 0; $j < $p; $j++)
                $Combi[$ncombi].=substr($Liste[$j], -1);
            $ncombi++;
            $rang--;
        }
    } while ($rang >= 0);
    return $Combi;
}

//--------------------
?>